package com.shopx.cm.service.impl;

import com.shopx.auth.bean.SysOrg;
import com.shopx.auth.dao.db1.SysOrgDao;
import com.shopx.auth.model.SysOrgModel;
import com.shopx.auth.service.impl.BaseAuthService;
import com.shopx.base.constants.ResultCodeEnum;
import com.shopx.base.exception.OriginException;
import com.shopx.base.exception.ShopxException;
import com.shopx.cm.bean.MaterialSaleDTO;
import com.shopx.cm.bean.MaterialSaleReqDTO;
import com.shopx.cm.dao.db2.MaterialSaleDao;
import com.shopx.cm.model.CmBrandCkModel;
import com.shopx.cm.service.ICmBrandCkService;
import com.shopx.cm.service.IMaterialSaleService;
import com.shopx.cmm.DTO.PageDTO;
import com.shopx.core.utils.DateTimeUtil;
import com.shopx.core.utils.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.List;
import java.util.Map;

@Service
@Slf4j
public class MaterialSaleServiceImpl extends BaseAuthService implements IMaterialSaleService {
    @Resource
    private MaterialSaleDao materialSaleDao;

    @Resource
    private ICmBrandCkService cmBrandCkService;

    @Resource
    private SysOrgDao sysOrgDao;

    @Override
    public int querySalesByMaterialCnt(MaterialSaleReqDTO dto){
        return materialSaleDao.querySalesByMaterialCnt(dto);
    }
    @Override
    public List<MaterialSaleDTO> querySalesByMaterialList(MaterialSaleReqDTO dto){
        //根据成控编码转换新品牌
        Map<String, CmBrandCkModel>  map = cmBrandCkService.selectListByCode();
        List<MaterialSaleDTO> list = materialSaleDao.querySalesByMaterialList(dto);
        for(MaterialSaleDTO record:list){
            record.setSupplyNewName(map.get(record.getCostSpecialCode().trim())==null?"无":map.get(record.getCostSpecialCode().trim()).getBrandName());
        }
        return list;

    }
    @Override
    public PageDTO<MaterialSaleDTO> getSalesByMaterial(MaterialSaleReqDTO dto){
        if (dto == null) {
            throw new ShopxException(ResultCodeEnum.PAR_NULL);
        }
        if(StringUtil.isEmpty(dto.getBillBegDate()) || StringUtil.isEmpty(dto.getBillEndDate()) ){
            throw new OriginException("请输入时间段查询");
        }
        String billBegDate = dto.getBillBegDate().replaceAll("-","");
        String billEndDate = dto.getBillEndDate().replaceAll("-","");
        Long disDays = DateTimeUtil.getDistanceDay(billBegDate,billEndDate);
        if(disDays>370){
            throw new OriginException("最多间隔时间不能一年时间");
        }
        //转换组织机构
//        String userOrgId = super.getUserOrgId();
//        SysOrg sysOrg = new SysOrg();
//        sysOrg.setOrgId(userOrgId);
//        sysOrg.setCpId(super.getUserCpId());
//        SysOrgModel som = sysOrgDao.selectByPrimaryKey(sysOrg);
//        if(som==null){
//            throw new OriginException("获取部门信息失败");
//        }
        String  orgId = dto.getOrgCode();
        String orgIds[] = super.queryCondOrgIds(orgId);
        dto.setOrgIdChk(orgIds);
//        if (!StringUtil.isEmpty(orgId)) {
//            //查询条件带有组织机构，查询条件组织机构下所有的部门和子部门工地
//            SysOrgModel sysOrgParam = new SysOrgModel();
//            sysOrgParam.setRootId(orgId);
//            List<SysOrgModel> list = sysOrgDao.selectOrgTreeList(sysOrgParam);
//            String orgIds[] = new String[list.size()];
//            for (int i = 0; i < list.size(); i++) {
//                orgIds[i] = list.get(i).getOrgId();
//            }
//            if (orgIds.length > 0) {
//                dto.setOrgIdChk(orgIds);
//                dto.setOrgCode(null);
//            }
//        } else {
////            String orgIds[] = super.queryUserOrgList(null);
////            boolean orgAdminFlag = super.queryOrgAdminFlag(super.getLoginUserId());
////            if (!orgAdminFlag) {
////                //没有所有权限
////                orgIds = super.queryUserOrgList(super.getLoginUserId());
////                dto.setOrgIdChk(orgIds);
////                dto.setOrgCode(null);
////            } else {
////                //有所有权限
////            }
//            String orgIds[] = super.queryUserOrgList(super.getLoginUserId());
//            dto.setOrgIdChk(orgIds);
//            dto.setOrgCode(null);
//        }
        //供货商转换成成控编码
        if(!StringUtil.isEmpty(dto.getSupplyNewName())){
            dto.setCostSpecialCode(this.getCodeByName(dto.getSupplyNewName()));
        }
        PageDTO<MaterialSaleDTO> pageDTO = new PageDTO<MaterialSaleDTO>();
        pageDTO.setiTotalDisplayRecords(querySalesByMaterialCnt(dto));
        pageDTO.setData(querySalesByMaterialList(dto));
        return pageDTO;
    }

    /**
     * 根据供货商名称，从缓存中获取成控编码
     * @param name
     * @return
     */
    private String getCodeByName(String name){
        Map<String, CmBrandCkModel> map = cmBrandCkService.selectListByMaterial();
        if(map.get(name)==null){
            return "";
        }
        return map.get(name).getCkCode();
    }




    @Override
    public int querySalesByBrandCnt(MaterialSaleReqDTO dto){
        return materialSaleDao.querySalesByBrandCnt(dto);
    }
    @Override
    public List<MaterialSaleDTO> querySalesByBrandList(MaterialSaleReqDTO dto){
        //根据成控编码转换新品牌
        Map<String, CmBrandCkModel>  map = cmBrandCkService.selectListByCode();
        List<MaterialSaleDTO> list = materialSaleDao.querySalesByBrandList(dto);
        for(MaterialSaleDTO record:list){
            record.setSupplyNewName(map.get(record.getCostSpecialCode().trim())==null?"无":map.get(record.getCostSpecialCode().trim()).getBrandName());
        }
        return list;

    }
    @Override
    public PageDTO<MaterialSaleDTO> getSalesByBrand(MaterialSaleReqDTO dto){
        if (dto == null) {
            throw new ShopxException(ResultCodeEnum.PAR_NULL);
        }
        if(StringUtil.isEmpty(dto.getBillBegDate()) || StringUtil.isEmpty(dto.getBillEndDate()) ){
            throw new OriginException("请输入时间段查询");
        }
        //转换组织机构
//        String userOrgId = super.getUserOrgId();
//        SysOrg sysOrg = new SysOrg();
//        sysOrg.setOrgId(userOrgId);
//        sysOrg.setCpId(super.getUserCpId());
//        SysOrgModel som = sysOrgDao.selectByPrimaryKey(sysOrg);
//        if(som==null){
//            throw new OriginException("获取部门信息失败");
//        }
        String  orgId = dto.getOrgCode();
        String orgIds[] = super.queryCondOrgIds(orgId);
        dto.setOrgIdChk(orgIds);
//        if (!StringUtil.isEmpty(orgId)) {
//            //查询条件带有组织机构，查询条件组织机构下所有的部门和子部门工地
//            SysOrgModel sysOrgParam = new SysOrgModel();
//            sysOrgParam.setRootId(orgId);
//            List<SysOrgModel> list = sysOrgDao.selectOrgTreeList(sysOrgParam);
//            String orgIds[] = new String[list.size()];
//            for (int i = 0; i < list.size(); i++) {
//                orgIds[i] = list.get(i).getOrgId();
//            }
//            if (orgIds.length > 0) {
//                dto.setOrgIdChk(orgIds);
//                dto.setOrgCode(null);
//            }
//        } else {
//            String orgIds[] = super.queryUserOrgList(super.getLoginUserId());
//            dto.setOrgIdChk(orgIds);
//            dto.setOrgCode(null);
////            String orgIds[] = new String[]{};
////            boolean orgAdminFlag = super.queryOrgAdminFlag(super.getLoginUserId());
////            if (!orgAdminFlag) {
////                //没有所有权限
////                orgIds = super.queryUserOrgList(super.getLoginUserId());
////                dto.setOrgIdChk(orgIds);
////                dto.setOrgCode(null);
////            } else {
////                //有所有权限
////            }
//        }
        //供货商转换成成控编码
        if(!StringUtil.isEmpty(dto.getSupplyNewName())){
            dto.setCostSpecialCode(this.getCodeByName(dto.getSupplyNewName()));
        }
        String billBegDate = dto.getBillBegDate().replaceAll("-","");
        String billEndDate = dto.getBillEndDate().replaceAll("-","");
        Long disDays = DateTimeUtil.getDistanceDay(billBegDate,billEndDate);
        if(disDays>370){
            throw new OriginException("最多间隔时间不能一年时间");
        }
        PageDTO<MaterialSaleDTO> pageDTO = new PageDTO<MaterialSaleDTO>();
        pageDTO.setiTotalDisplayRecords(querySalesByBrandCnt(dto));
        pageDTO.setData(querySalesByBrandList(dto));
        return pageDTO;
    }


    @Override
    public int querySalesByCodeCnt(MaterialSaleReqDTO dto){
        return materialSaleDao.querySalesByCodeCnt(dto);
    }
    @Override
    public List<MaterialSaleDTO> querySalesByCodeList(MaterialSaleReqDTO dto){
        //根据成控编码转换新品牌
        Map<String, CmBrandCkModel>  map = cmBrandCkService.selectListByCode();
        List<MaterialSaleDTO> list = materialSaleDao.querySalesByCodeList(dto);
        for(MaterialSaleDTO record:list){
            record.setSupplyNewName(map.get(record.getCostSpecialCode().trim())==null?"无":map.get(record.getCostSpecialCode().trim()).getBrandName());
        }
        return list;

    }
    @Override
    public PageDTO<MaterialSaleDTO> getSalesByCode(MaterialSaleReqDTO dto){
        if (dto == null) {
            throw new ShopxException(ResultCodeEnum.PAR_NULL);
        }
        if(StringUtil.isEmpty(dto.getBillBegDate()) || StringUtil.isEmpty(dto.getBillEndDate()) ){
            throw new OriginException("请输入时间段查询");
        }
        //供货商转换成成控编码
        if(!StringUtil.isEmpty(dto.getSupplyNewName())){
            dto.setCostSpecialCode(this.getCodeByName(dto.getSupplyNewName()));
        }
        //转换组织机构
//        String userOrgId = super.getUserOrgId();
//        SysOrg sysOrg = new SysOrg();
//        sysOrg.setOrgId(userOrgId);
//        sysOrg.setCpId(super.getUserCpId());
//        SysOrgModel som = sysOrgDao.selectByPrimaryKey(sysOrg);
//        if(som==null){
//            throw new OriginException("获取部门信息失败");
//        }
        String  orgId = dto.getOrgCode();
        String orgIds[] = super.queryCondOrgIds(orgId);
        dto.setOrgIdChk(orgIds);
//        if (!StringUtil.isEmpty(orgId)) {
//            //查询条件带有组织机构，查询条件组织机构下所有的部门和子部门工地
//            SysOrgModel sysOrgParam = new SysOrgModel();
//            sysOrgParam.setRootId(orgId);
//            List<SysOrgModel> list = sysOrgDao.selectOrgTreeList(sysOrgParam);
//            String orgIds[] = new String[list.size()];
//            for (int i = 0; i < list.size(); i++) {
//                orgIds[i] = list.get(i).getOrgId();
//            }
//            if (orgIds.length > 0) {
//                dto.setOrgIdChk(orgIds);
//                dto.setOrgCode(null);
//            }
//        } else {
//            String orgIds[] = super.queryUserOrgList(super.getLoginUserId());
//            dto.setOrgIdChk(orgIds);
//            dto.setOrgCode(null);
////            String orgIds[] = new String[]{};
////            boolean orgAdminFlag = super.queryOrgAdminFlag(super.getLoginUserId());
////            if (!orgAdminFlag) {
////                //没有所有权限
////                orgIds = super.queryUserOrgList(super.getLoginUserId());
////                dto.setOrgIdChk(orgIds);
////                dto.setOrgCode(null);
////            } else {
////                //有所有权限
////            }
//        }
        String billBegDate = dto.getBillBegDate().replaceAll("-","");
        String billEndDate = dto.getBillEndDate().replaceAll("-","");
        Long disDays = DateTimeUtil.getDistanceDay(billBegDate,billEndDate);
        if(disDays>370){
            throw new OriginException("最多间隔时间不能一年时间");
        }
        PageDTO<MaterialSaleDTO> pageDTO = new PageDTO<MaterialSaleDTO>();
        pageDTO.setiTotalDisplayRecords(querySalesByCodeCnt(dto));
        pageDTO.setData(querySalesByCodeList(dto));
        return pageDTO;
    }


    @Override
    public int querySalesByMthCnt(MaterialSaleReqDTO dto){
        return materialSaleDao.querySalesByMthCnt(dto);
    }
    @Override
    public List<MaterialSaleDTO> querySalesByMthList(MaterialSaleReqDTO dto){
        //根据成控编码转换新品牌
        Map<String, CmBrandCkModel>  map = cmBrandCkService.selectListByCode();
        List<MaterialSaleDTO> list = materialSaleDao.querySalesByMthList(dto);
        for(MaterialSaleDTO record:list){
            record.setSupplyNewName(map.get(record.getCostSpecialCode().trim())==null?"无":map.get(record.getCostSpecialCode().trim()).getBrandName());
        }
        return list;

    }
    @Override
    public PageDTO<MaterialSaleDTO> getSalesByMth(MaterialSaleReqDTO dto){
        if (dto == null) {
            throw new ShopxException(ResultCodeEnum.PAR_NULL);
        }
        if(StringUtil.isEmpty(dto.getBillBegDate()) || StringUtil.isEmpty(dto.getBillEndDate()) ){
            throw new OriginException("请输入时间段查询");
        }
        //转换组织机构
//        String userOrgId = super.getUserOrgId();
//        SysOrg sysOrg = new SysOrg();
//        sysOrg.setOrgId(userOrgId);
//        sysOrg.setCpId(super.getUserCpId());
//        SysOrgModel som = sysOrgDao.selectByPrimaryKey(sysOrg);
//        if(som==null){
//            throw new OriginException("获取部门信息失败");
//        }
        String  orgId = dto.getOrgCode();
        String orgIds[] = super.queryCondOrgIds(orgId);
        dto.setOrgIdChk(orgIds);
//        if (!StringUtil.isEmpty(orgId)) {
//            //查询条件带有组织机构，查询条件组织机构下所有的部门和子部门工地
//            SysOrgModel sysOrgParam = new SysOrgModel();
//            sysOrgParam.setRootId(orgId);
//            List<SysOrgModel> list = sysOrgDao.selectOrgTreeList(sysOrgParam);
//            String orgIds[] = new String[list.size()];
//            for (int i = 0; i < list.size(); i++) {
//                orgIds[i] = list.get(i).getOrgId();
//            }
//            if (orgIds.length > 0) {
//                dto.setOrgIdChk(orgIds);
//                dto.setOrgCode(null);
//            }
//        } else {
//            String orgIds[] = super.queryUserOrgList(super.getLoginUserId());
//            dto.setOrgIdChk(orgIds);
//            dto.setOrgCode(null);
////            String orgIds[] = new String[]{};
////            boolean orgAdminFlag = super.queryOrgAdminFlag(super.getLoginUserId());
////            if (!orgAdminFlag) {
////                //没有所有权限
////                orgIds = super.queryUserOrgList(super.getLoginUserId());
////                dto.setOrgIdChk(orgIds);
////                dto.setOrgCode(null);
////            } else {
////                //有所有权限
////            }
//        }
        //供货商转换成成控编码
        if(!StringUtil.isEmpty(dto.getSupplyNewName())){
            dto.setCostSpecialCode(this.getCodeByName(dto.getSupplyNewName()));
        }
        String billBegDate = dto.getBillBegDate().replaceAll("-","");
        String billEndDate = dto.getBillEndDate().replaceAll("-","");
        Long disDays = DateTimeUtil.getDistanceDay(billBegDate,billEndDate);
        if(disDays>370){
            throw new OriginException("最多间隔时间不能一年时间");
        }
        PageDTO<MaterialSaleDTO> pageDTO = new PageDTO<MaterialSaleDTO>();
        pageDTO.setiTotalDisplayRecords(querySalesByMthCnt(dto));
        pageDTO.setData(querySalesByMthList(dto));
        return pageDTO;
    }

    @Override
    public List<MaterialSaleDTO> querySalesByGroupList(MaterialSaleReqDTO dto){
        //转换组织机构
//        String userOrgId = super.getUserOrgId();
//        SysOrg sysOrg = new SysOrg();
//        sysOrg.setOrgId(userOrgId);
//        sysOrg.setCpId(super.getUserCpId());
//        SysOrgModel som = sysOrgDao.selectByPrimaryKey(sysOrg);
//        if(som==null){
//            throw new OriginException("获取部门信息失败");
//        }
        String  orgId = dto.getOrgCode();
        String orgIds[] = super.queryCondOrgIds(orgId);
        dto.setOrgIdChk(orgIds);
//        if (!StringUtil.isEmpty(orgId)) {
//            //查询条件带有组织机构，查询条件组织机构下所有的部门和子部门工地
//            SysOrgModel sysOrgParam = new SysOrgModel();
//            sysOrgParam.setRootId(orgId);
//            List<SysOrgModel> list = sysOrgDao.selectOrgTreeList(sysOrgParam);
//            String orgIds[] = new String[list.size()];
//            for (int i = 0; i < list.size(); i++) {
//                orgIds[i] = list.get(i).getOrgId();
//            }
//            if (orgIds.length > 0) {
//                dto.setOrgIdChk(orgIds);
//                dto.setOrgCode(null);
//            }
//        } else {
//            String orgIds[] = super.queryUserOrgList(super.getLoginUserId());
//            dto.setOrgIdChk(orgIds);
//            dto.setOrgCode(null);
////            String orgIds[] = new String[]{};
////            boolean orgAdminFlag = super.queryOrgAdminFlag(super.getLoginUserId());
////            if (!orgAdminFlag) {
////                //没有所有权限
////                orgIds = super.queryUserOrgList(super.getLoginUserId());
////                dto.setOrgIdChk(orgIds);
////                dto.setOrgCode(null);
////            } else {
////                //有所有权限
////            }
//        }
        if("1".equals(dto.getGroupType())){
            //大区
            return materialSaleDao.querySalesByRegionList(dto);
        }else if("2".equals(dto.getGroupType())){
            //品牌
            List<MaterialSaleDTO> list = materialSaleDao.querySalesBySpList(dto);
            Map<String, CmBrandCkModel>  map = cmBrandCkService.selectListByCode();
            for(MaterialSaleDTO record:list){
                //转换成品牌
                try {
                    record.setName(map.get(record.getName().trim()) == null ? "无" : map.get(record.getName().trim()).getBrandName());
                }catch (Exception e){
                    log.error("querySalesByGroupList.name:{}",record.getName());
                    record.setName("无");
                }
            }
            return list;
        }else if("3".equals(dto.getGroupType())){
            //材料
            return materialSaleDao.querySalesByNameList(dto);
        }
        return null;
    }

    @Override
    public List<MaterialSaleDTO> querySalesListByCode(MaterialSaleReqDTO dto){
        if (dto == null) {
            throw new ShopxException(ResultCodeEnum.PAR_NULL);
        }
        if(StringUtil.isEmpty(dto.getBillBegDate()) || StringUtil.isEmpty(dto.getBillEndDate()) ){
            throw new OriginException("请输入时间段查询");
        }
        if(StringUtil.isEmpty(dto.getSubCostSpecialCode())){
            throw new OriginException("请选择品类");
        }
        String billBegDate = dto.getBillBegDate().replaceAll("-","");
        String billEndDate = dto.getBillEndDate().replaceAll("-","");
        Long disDays = DateTimeUtil.getDistanceDay(billBegDate,billEndDate);
        if(disDays>370){
            throw new OriginException("最多间隔时间不能一年时间");
        }
        //转换组织机构
//        String userOrgId = super.getUserOrgId();
//        SysOrg sysOrg = new SysOrg();
//        sysOrg.setOrgId(userOrgId);
//        sysOrg.setCpId(super.getUserCpId());
//        SysOrgModel som = sysOrgDao.selectByPrimaryKey(sysOrg);
//        if(som==null){
//            throw new OriginException("获取部门信息失败");
//        }
        String  orgId = dto.getOrgCode();
        String orgIds[] = super.queryCondOrgIds(orgId);
        dto.setOrgIdChk(orgIds);
//        if (!StringUtil.isEmpty(orgId)) {
//            //查询条件带有组织机构，查询条件组织机构下所有的部门和子部门工地
//            SysOrgModel sysOrgParam = new SysOrgModel();
//            sysOrgParam.setRootId(orgId);
//            List<SysOrgModel> list = sysOrgDao.selectOrgTreeList(sysOrgParam);
//            String orgIds[] = new String[list.size()];
//            for (int i = 0; i < list.size(); i++) {
//                orgIds[i] = list.get(i).getOrgId();
//            }
//            if (orgIds.length > 0) {
//                dto.setOrgIdChk(orgIds);
//                dto.setOrgCode(null);
//            }
//        } else {
//            String orgIds[] = super.queryUserOrgList(super.getLoginUserId());
//            dto.setOrgIdChk(orgIds);
//            dto.setOrgCode(null);
////            String orgIds[] = new String[]{};
////            boolean orgAdminFlag = super.queryOrgAdminFlag(super.getLoginUserId());
////            if (!orgAdminFlag) {
////                //没有所有权限
////                orgIds = super.queryUserOrgList(super.getLoginUserId());
////                dto.setOrgIdChk(orgIds);
////                dto.setOrgCode(null);
////            } else {
////                //有所有权限
////            }
//        }

        Map<String, CmBrandCkModel>  map = cmBrandCkService.selectListByCode();
        List<MaterialSaleDTO> list = materialSaleDao.querySalesListByCode(dto);
        //统计出所有的数据
        BigDecimal allNumber = new BigDecimal(0);
        for(MaterialSaleDTO item:list){
            allNumber = allNumber.add(new BigDecimal(item.getValue()));
        }
        for(MaterialSaleDTO record:list){
            BigDecimal ratio = (new BigDecimal(record.getValue()).divide(allNumber, 2, RoundingMode.HALF_UP)).multiply(new BigDecimal(100));
            record.setName(map.get(record.getName().trim())==null?"无":map.get(record.getName().trim()).getBrandName()+"（占比："+ratio+"%）/"+allNumber);
        }
        return list;
    }
}
